package com.zmn.plat.persistence.interfaces.channel;

import com.zmn.plat.common.dto.KVDTO;
import com.zmn.plat.model.entity.category.ServCategAndCategTwoQuery;
import com.zmn.plat.model.entity.channel.ChannelServiceCategory;
import com.zmn.plat.model.vo.channel.ChannelServiceAreaProductCategoryVo;
import com.zmn.plat.model.vo.channel.category.ChannelCategoryUnionVo;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 渠道服务分类
 *
 * @author xiangjunming
 * @since 2019 /08/19 12:19:07
 */
public interface ChannelServiceCategoryDAO {

    /**
     * 根据ID查询
     *
     * @param id the id
     * @return the channel new service area
     */
    ChannelServiceCategory findByKey(Integer id);

    /**
     * 描述: 根据渠道id获取开通的服务分类、一级产品分类、产品（前台）
     *
     * @param channelId 渠道id
     * @return com.zmn.common.dto.KvDTO
     * @author guoqiao
     * @since 2021/5/28 9:33
     */
    List<KVDTO> listAllCategoryByChannelId(@Param("channelId") Integer channelId);

    /**
     * 根据渠道ID查询后台服务品类
     * @param channelId 渠道ID
     * @return
     */
    List<ChannelServiceCategory> listByChannelId(@Param("channelId") Integer channelId);

    /**
     * 根据渠道ID查询前台服务品类
     * @param channelId
     * @return
     */
    List<ChannelServiceCategory> listShowCategoryByChannelId(@Param("channelId") Integer channelId);

    /**
     * 根据渠道ID和产品类型查询服务分类
     *
     * @param channelId 渠道ID
     * @param showType  产品分类 1后台 2前台
     * @return list list
     */
    List<ChannelServiceAreaProductCategoryVo> listByChannelIdAndShowType(@Param("channelId") Integer channelId, @Param("showType") Integer showType);
    /**
     * 根据渠道ID和服务分类ID查询服务分类
     * @param channelId 渠道ID
     * @param servCategId 服务分类ID
     * @param showType 产品分类 1后台 2前台
     * @return
     */
    List<ChannelServiceCategory> listByChannelIdAndServCategId(@Param("channelId") Integer channelId, @Param("servCategId") Integer servCategId, @Param("showType") Integer showType);
    /**
     * 根据渠道ID和服务分类ID查询服务分类
     *
     * @param channelId
     *            渠道ID
     * @param categId
     *            二级分类id
     * @param showType
     *            产品分类 1后台 2前台
     * @return
     */
    List<ChannelServiceCategory> listByChannelIdAndCategIdAndShowType(@Param("channelId")Integer channelId, @Param("categIds")List<Integer> categIds, @Param("showType")Integer showType);
    /**
     * 根据渠道id，服务分类id，一级分类id，二级分类id集合，查询已经开通的二级分类id
     * @param channelId    渠道id
     * @param servCategId  服务分类id
     * @param categIds     二级分类id集合
     * @return
     */
    List<Integer> listCategIdByChannelIdAndServCategIdAndCategIds(@Param("channelId")Integer channelId,@Param("servCategId") Integer servCategId, @Param("categIds") List<Integer> categIds);

    /**
     * 根据渠道ID和服务分类ID集合查询渠道开通品类
     * @param channelId        渠道ID
     * @param servCategIdList  服务分类ID集合
     * @return
     */
    List<ChannelCategoryUnionVo> listCategoryUnionVoByChannelIdAndServCategIdList(@Param("channelId")Integer channelId, @Param("servCategIdList") List<Integer> servCategIdList);

    /**
     * 渠道后台分类去掉之后，根据渠道前台分类数据翻译为后台分类数据
     * @param productCategories 前台分类数据
     * @return
     */
    List<ChannelServiceAreaProductCategoryVo> listCategoryByShowCategList(@Param("productCategories") List<ChannelServiceAreaProductCategoryVo> productCategories);

    /**
     * 渠道开通的可用分类
     *
     * @param channelId
     *            渠道id
     * @return
     */
    int countAvailableCategoryByChannelId(@Param("channelId")Integer channelId);

    /**
     * 根据渠道ID，查询渠道开通的服务分类ID和后台二级产品分类ID集合
     *
     * @param channelId 渠道ID
     * @return
     */
    List<ServCategAndCategTwoQuery> listServCategAndCategTwoQueryByChannelId(@Param("channelId") Integer channelId);

    /**
     * 根据渠道ID，查询渠道开通的服务分类ID和前台二级产品分类ID集合
     *
     * @param channelId 渠道ID
     * @return
     */
    List<ServCategAndCategTwoQuery> listServCategAndShowCategTwoQueryByChannelId(@Param("channelId") Integer channelId);

    /**
     * 根据ID修改
     *
     * @param record the record
     * @return the int
     */
    int updateByKey(ChannelServiceCategory record);

    /**
     * 新增
     *
     * @param record the record
     * @return the int
     */
    int insert(ChannelServiceCategory record);

    /**
     * 批量新增
     *
     * @param list the list
     * @return the int
     */
    int insertBatch(List<ChannelServiceCategory> list);

    /**
     * 根据ID删除服务分类
     *
     * @param id the id
     * @return the int
     */
    int deleteByKey(Integer id);


    /**
     * 根据渠道ID删除服务分类
     *
     * @param channelId the channel id
     * @param showType 产品分类 1后台 2前台
     * @return the int
     */
    int deleteByChannelId(@Param("channelId") Integer channelId, @Param("showType") Integer showType);

    /**
     * 根据渠道ID和服务分类ID删除分类
     *
     * @param channelId the channel id
     * @param servCategId
     * @param showType  产品分类 1后台 2前台
     * @return the int
     */
    int deleteByChannelIdAndServiceId(@Param("channelId") Integer channelId, @Param("servCategId") Integer servCategId, @Param("showType") Integer showType);

    /**
     * 描述: 从旧渠道复制到新渠道
     *
     * @param originalChannelId 原渠道ID
     * @param targetChannelId 新渠道ID
     * @param operator 操作者
     * @return java.lang.Boolean
     * @author guoqiao
     * @since 2021/6/8 13:49
     */
    void copy(Integer originalChannelId, int targetChannelId, String operator);
}